perm filename PUP0B.BPL[11,HE] blob
sn#494222 filedate 1982-04-29 generic text, type T, neo UTF8
// PUP0B.BPL -- ROUTINES FOR INTERFACING TO ETHERNET HARDWARE
// Copyright Xerox Corporation 1979
//
GET "PUPLIB.HDR"
GET "LEVEL0.HDR"
GET "LEVEL1.HDR"
//
LET INITPDPETHER(ZONE, CTXQ) BE
//
[
LET CTX = NIL
LET NDB = ALLOCATE(ZONE,26)
LET HOST = INITETHERIO()
ZERO(NDB,26)
NDB!LHOST := HOST
NDB!ENCAPSULATEPUP := ENCAPSULATEETHERPUP
NDB!LEVEL0TRANSMIT := SENDETHERPACKET
NDB!DEVICENUM := 0
NDB!PFPREDICATE := ETHERPUPFILTER
NDB!PFQUEUE := PBIIQ
ENQUEUE(LV NDB!PFQ,LV NDB!PFLINK)
ENQUEUE(NDBQ,NDB)
CTX := INITIALIZECONTEXT(ALLOCATE(ZONE,20),20,FEEDETHER,1)
CTX!3 := NDB
ENQUEUE(CTXQ,CTX)
STARTETHERINPUT(NDB)
]
//
AND ENCAPSULATEETHERPUP(PBI,PDH) BE
//
[
PBI!(ENCAPSULATION+0) := (PDH LSHIFT 8) + (PBI!NDB)!LHOST
PBI!(ENCAPSULATION+1) := TYPEPUP
PBI!PACKETLENGTH := ((PBI!LENGTH)+5) RSHIFT 1
]
//
AND SENDETHERPACKET(PBI) BE
//
[
LET ENDB = PBI!NDB
ENQUEUE(LV ENDB!OQ,PBI)
IF ENDB!OUTPBI EQ 0 THEN STARTETHEROUTPUT(ENDB)
]
//
AND FEEDETHER(CTX) BE
//
[
LET NDB = CTX!3
IF NDB!INPBI EQ 0 & PBIFREEQ!0 NE 0 THEN STARTETHERINPUT(NDB)
IF NDB!OUTPBI NE 0 & TIMERHASEXPIRED(LV NDB!TTIMER) THEN
[
// TRANSMITTER HAS TIMED OUT
LET OCSADDR = ETHEROCS
RV OCSADDR := 0 // TURN OFF TRANSMITTER
IF NDB!OUTPBI NE 0 THEN ENQUEUE((NDB!OUTPBI)!QUEUE,NDB!OUTPBI)
NDB!OUTPBI := 0
NDB!LOAD := 0
STARTETHEROUTPUT(NDB)
]
BLOCK()
] REPEAT